- Görkem Güray/
- 100 Günde SwiftUI Notları/
- 5.Gün - Swift Koşullu İfadeler : If , Else If, Switch Case, Ternary Operator/
5.Gün - Swift Koşullu İfadeler : If , Else If, Switch Case, Ternary Operator
Table of Contents
Swift’te bazı koşulları kontrol etmemiz gerekebilir. Koşulun true
veya false
olmasına göre farklı işlemler yapmak isteyebiliriz. Örneğin;
- Öğrenci sınav sonucu 80’in üstündeyse ekrana başarı mesajı yazdırmak isteyebiliriz.
- Bir Array’e veri eklediğimizde 3 ten fazla veri olacaksa, en eskisini silmek isteyebiliriz.
Elbette yukarıdaki durumları arttırabiliriz. Fakat genel mantık bu şekilde.
Swift’te bu koşul durumunu kontrol edebileceğimiz yapılardan biri if yapısıdır.
Swift If Yapısı #
if someCondition {
print("Do something")
}
Yukarıdaki kodu incelediğimizde;
- İfade
if
ile başlar, bu Swift’e bir koşulu kontrol etmek istediğimizi bildirir. someCondition
kısmı koşulu yazdığımız yerdir.- Eğer koşul doğruysa, terminale “Do something” yazar, yanlışsa hiçbir şey yazmaz.
{ }
sembollerinin arasındaki kodlar, Swift’te kod bloğu olarak adalandırılmaktadır. Yukarıdaki kod örneğinde koşul doğruysa çalıştırılacak kodlar kıvırcık parantezlerin arasına yazılmıştır.
let score = 85
if score > 80 {
print("Great job!")
}
Yukarıdaki kodda koşulumuz score > 80
kısmıdır. Eğer score
değişkeninin değeri 80’de büyükse ekrana “Great job!” yazılacaktır. Bizim durumumuzda (score
85 olduğundan) koşulu sağlamış oluruz ve ekrana mesaj yazdırılır.
Karşılaştırma Operatörleri #
Yukarıdaki örnekte >
operatörü karşılaştırma operatörü olarak adlandırılmaktadır. Çünkü iki öğeyi karşılaştırır ve neticesinde true
veya false
döner.
Karşılaştırma operatörlerini inceleyelim;
>
: Büyük mü?<
: Küçük mü?>=
: Büyük veya eşit mi?<=
: Küçük veya eşit mi?==
: Eşit mi?!=
: Eşit değil mi?
let speed = 88
let percentage = 85
let age = 18
let name = "John"
if speed <= 88 {
print("Where we're going we don't need roads.")
}
if speed > 88 {
print("Nothing")
//HERHANGİ BİR ÇIKTI VERMEZ
}
if percentage < 85 {
print("Sorry, you failed the test.")
//HERHANGİ BİR ÇIKTI VERMEZ
}
if age >= 18 {
print("You're eligible to vote")
}
if name == "John" {
print("Greetings John")
}
if name != "" {
print("There is a name")
}
//ÇIKTILAR:
//Where we're going we don't need roads.
//You're eligible to vote
//Greetings John
//There is a name
Swift bir çok değeri birbiri ile karşılaştırmamıza olanak tanımaktadır. Örneği inceleyelim;
let firstName = "Paul"
let secondName = "Sophie"
let firstAge = 40
let secondAge = 10
Değer atamalarımızı yukarıda yaptık, aşağıda da karşılaştırma işlemini gerçekleştirelim.
print(firstName == secondName) //false
print(firstName != secondName) //true
print(firstName < secondName) //true
print(firstName >= secondName) //false
print(firstAge == secondAge) //false
print(firstAge != secondAge) //true
print(firstAge < secondAge) //false
print(firstAge >= secondAge) //true
Arka planda Swift akıllıca davranır ve String ifadeleri harf sırasına göre karşılaştırma yapabilir. Bu sadece String’ler ile sınırlı değildir. Örneğin Swift’te bulunan Date türü verileri de kolaylıkla karşılaştırabiliriz.
Eğer enum tipindeki değerleri karşılaştırmak istiyorsak, enum ifadeye Comparable
eklemeliyiz.
enum Sizes: Comparable {
case small
case medium
case large
}
let first = Sizes.small
let second = Sizes.large
print(first < second)
Çıktı true olacaktır, çünkü enum listesinde small , large ‘dan önce gelir.
Çoklu Koşullar Nasıl Kontrol Edilir? #
Çoklu koşulların kontrolü için, else
bloğunu kullanırız. else
bloğu koşul, true olmadığı durumda çalıştırılacak olan kod bloğudur.
if someCondition {
print("This will run if the condition is true")
} else {
print("This will run if the condition is false")
}
ilk durum başarısız olursa, yeni bir kontrol yapmamızı sağlayan else if
adında bir yapı daha vardır.
let a = false
let b = true
if a {
print("Code to run if a is true")
} else if b {
print("Code to run if a is false but b is true")
} else {
print("Code to run if both a and b are false")
}
//ÇIKTI: Code to run if a is false but b is true
İstersek daha da fazla else if
ekleyebiliriz, fakat ekleme yaptıkça kodumuz da karmaşıklaşmaya başlıyor.
Bazen de birden fazla durumu kontrol etmek isteyebiliriz. Örneğin şöyle bir durumla olabilir; “Bugün hava sıcaklığı 20 santigrat dereceden büyük ve 30 dereceden küçükse ekrana bir mesaj yazdıralım”
let temp = 25
if temp > 20 {
if temp < 30 {
print("It's a nice day.")
}
}
Yukarıdaki kod gayet iyi çalışır, fakat Swift burada bize daha iyi bir alternatif sunuyor : &&
ve anlamına gelen bu operatör ile, iki adet koşulu birleştirip şu şekilde yazabiliriz.
if temp > 20 && temp < 30 {
print("It's a nice day.")
}
||
operatörü ise veya anlamına gelmektedir. Örneğin; “Bir kullanıcı en az 18 yaşındaysa veya ebeveyninden izni varsa oyun alabilir” dediğimizi varsayalım. Bunu aşağıdaki gibi kodlayabiliriz.
let userAge = 14
let hasParentalConsent = true
if userAge >= 18 || hasParentalConsent == true {
print("You can buy the game")
}
//ÇIKTI: You can buy the game
Bir koddaki == true
kısmı kaldırılabilir. Bu durumda kod;
if userAge >= 18 || hasParentalConsent {
print("You can buy the game")
}
Swift Switch Yapısı #
Daha fazla koşulu kontrol etmek için, istediğimiz kadar if
ve else if
kullanabiliriz. Fakat bu kodumuzun okunabilirliğini önemli ölçüde azaltacaktır. Enum ile oluşturduğumuz hava durumunu kullanarak bir if koşul ifadesi yazsaydık aşağıdaki gibi görünürdü.
enum Weather {
case sun, rain, wind, snow, unknown
}
let forecast = Weather.sun
if forecast == .sun {
print("It should be a nice day.")
} else if forecast == .rain {
print("Pack an umbrella.")
} else if forecast == .wind {
print("Wear something warm")
} else if forecast == .snow {
print("School is cancelled.")
} else {
print("Our forecast generator is broken!")
}
Yukarıdaki kodu daha da sadeleştirerek switch
yaspısı ile şu şekilde yazabiliriz.
switch forecast {
case .sun:
print("It should be a nice day.")
case .rain:
print("Pack an umbrella.")
case .wind:
print("Wear something warm")
case .snow:
print("School is cancelled.")
case .unknown:
print("Our forecast generator is broken!")
}
switch forecast
ile başlıyoruz, bu Swift’e hangi değeri kontrol etmek istediğimizi bildirir.case
deyimi ile devam ediyoruz, burada enum ifademizdeki durumları belirliyoruz.- case ifadelerinin her biri
Weather
enumunu kontrol ettiği için her defasındaWeather.sun
vs. yazmamıza gerek yok. - Eşleşen durumdan sonra yapılacakların başlangıcı belirlemek için
:
kullanıyoruz. - Switch ifadesini bitirmek için kapatma parantezimizi yerleştiriyoruz.
Swift Switch Yapısının Önemli Noktaları #
-
Switch’te kontrol edilen durumlar kapsayıcı olmak zorundadır, yani olası tüm değerler Switch içinde ele alınmalıdır. Örneğin yukarıdaki
Weather
enumundaki sun, rain, wind, snow, unknown durumlarının her biri için Switch içerisinde bircase
mutlaka oluşturulmalıdır.let place = "Metropolis" switch place { case "Gotham": print("You're Batman!") case "Mega-City One": print("You're Judge Dredd!") case "Wakanda": print("You're Black Panther!") default: print("Who are you?") }
Yukarıdaki gib bir String ifade için switch değerlendirmesi yaptığımızı düşünelim. Bu durumda bütün olası String ifadeleri
case
olarak yazmam mümkün değildir. İşte bunun içindefault
anahtar kelimesini kullanırız.default
durumu, öncesindeki hiçbircase
in eşleşmemesi durumunda yürütülecek kodları içerir. (Evetdefault
en sonda olmalıdır.) -
Swift’te kontrol ettiğimiz koşulla eşleşen ilk durum yürütülür, daha sonraki
case
’ler kontrol edilmez.Fakat herhangi bir nedenden ötürü diğer
case
lerin de işletilmesini istiyorsakfallthrough
’u kullanabiliriz.let day = 5 print("My true love gave to me…") switch day { case 5: print("5 golden rings") case 4: print("4 calling birds") case 3: print("3 French hens") case 2: print("2 turtle doves") default: print("A partridge in a pear tree") } //ÇIKTI : My true love gave to me… // 5 golden rings
fallthrough
kullanarak yeniden yazalım.let day = 5 print("My true love gave to me…") switch day { case 5: print("5 golden rings") fallthrough case 4: print("4 calling birds") fallthrough case 3: print("3 French hens") fallthrough case 2: print("2 turtle doves") fallthrough default: print("A partridge in a pear tree") } //ÇIKTI : My true love gave to me… // 5 golden rings // 4 calling birds // 3 French hens // 2 turtle doves // A partridge in a pear tree
Neden Switch? #
- Switch kontrollerinin kapsamlı olması gerekir. Her olası değer için
case
bloğuna sahip olmamız (enum’daki tüm durumlar) veyadefault
bir durum belirlememiz gerekir.Bu sebeple bir olasılığı gözden kaçırmamız zorlaşır.if
veelse if
için böyle bir zorunluluk yoktur. - Bir değeri birden fazla muhtemel sonuç için kontrol ederken, switch kullanırsak bu değer yalnızca bir kez okunurken, if yapısında her defasında değer çağrılır. Bu durum performans sorunlarına neden olabilir.
- Switch kontrollerinin kapsamlı olması gerekir. Her olası değer için
Ternary Operatörü (?:) #
Bu operatör, 3 parça giriş almaktadır. Ternary Operatörü bir koşulu kontrol etmemizi ve iki değerden birini döndürmemizi sağlar. true ise birini, false ise diğerini.
Örneğin bir kişinin yaşına göre oy kullanıp kullanamayacağını kontrol edelim.
let age = 18
let canVote = age >= 18 ? "Yes" : "No"
Burada canVote
değişkenin değeri “Yes” olacaktır. Yukarıdaki örnek aslında bir if else
bloğudur. Ama daha kısa yazılmış hali.
Ternary Operatörünün yapısını WTF ile aklınız tutabilirsiniz. (aynı zamanda İngilizcedeki What The Fck* ‘ın kısaltması)
- What - Koşulumuz Ne? :
age≥18
- True - Koşul doğru ise hangi değer dönecek :
“Yes”
- False - Koşul yanlış ise hangi değer dönecek :
“No”
Örnek:
enum Theme {
case light, dark
}
let theme = Theme.dark
let background = theme == .dark ? "black" : "white"
print(background)
//ÇIKTI : black
- What :
theme == .dark
- True :
“black”
- False :
“white”
Bu yazıyı İngilizce olarak da okuyabilirsiniz.
You can also read this article in English.